package com.fish.web.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.servers.Server;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * Knife4j接口文档配置
 */
@Configuration
public class Knife4jConfig {

    /**
     * 全局配置
     */
    @Bean
    public OpenAPI customOpenAPI() {
        // 服务器配置
        List<Server> servers = new ArrayList<>();
        servers.add(new Server().url("http://localhost:8080").description("本地环境"));
        servers.add(new Server().url("https://api.fish.com").description("生产环境"));

        return new OpenAPI()
                .info(new Info()
                        .title("闲鱼仿制系统 API 文档")
                        .description("闲鱼仿制系统后端接口文档，包含用户管理、角色管理、菜单管理、通知管理、聊天等功能模块")
                        .version("v1.0.0")
                        .contact(new Contact()
                                .name("Fish Team")
                                .email("admin@fish.com")
                                .url("https://www.fish.com"))
                        .license(new License()
                                .name("Apache 2.0")
                                .url("https://www.apache.org/licenses/LICENSE-2.0.html")))
                .servers(servers);
    }

    /**
     * 认证授权模块API分组
     */
    @Bean
    public GroupedOpenApi authApi() {
        return GroupedOpenApi.builder()
                .group("1. 认证授权")
                .pathsToMatch("/api/auth/**")
                .build();
    }

    /**
     * 用户管理模块API分组
     */
    @Bean
    public GroupedOpenApi userApi() {
        return GroupedOpenApi.builder()
                .group("2. 用户管理")
                .pathsToMatch("/api/user/**")
                .build();
    }

    /**
     * 角色管理模块API分组
     */
    @Bean
    public GroupedOpenApi roleApi() {
        return GroupedOpenApi.builder()
                .group("3. 角色管理")
                .pathsToMatch("/api/role/**")
                .build();
    }

    /**
     * 菜单管理模块API分组
     */
    @Bean
    public GroupedOpenApi menuApi() {
        return GroupedOpenApi.builder()
                .group("4. 菜单管理")
                .pathsToMatch("/api/menu/**")
                .build();
    }

    /**
     * 组织管理模块API分组
     */
    @Bean
    public GroupedOpenApi organizationApi() {
        return GroupedOpenApi.builder()
                .group("5. 组织管理")
                .pathsToMatch("/api/organization/**", "/api/title/**")
                .build();
    }

    /**
     * 通知管理模块API分组
     */
    @Bean
    public GroupedOpenApi notificationApi() {
        return GroupedOpenApi.builder()
                .group("6. 通知管理")
                .pathsToMatch("/api/notification/**")
                .build();
    }

    /**
     * 聊天模块API分组
     */
    @Bean
    public GroupedOpenApi chatApi() {
        return GroupedOpenApi.builder()
                .group("7. 聊天管理")
                .pathsToMatch("/api/chat/**")
                .build();
    }

    /**
     * 字典管理模块API分组
     */
    @Bean
    public GroupedOpenApi dictApi() {
        return GroupedOpenApi.builder()
                .group("8. 字典管理")
                .pathsToMatch("/api/dict/**")
                .build();
    }

    /**
     * 文件管理模块API分组
     */
    @Bean
    public GroupedOpenApi fileApi() {
        return GroupedOpenApi.builder()
                .group("9. 文件管理")
                .pathsToMatch("/api/file/**")
                .build();
    }

    /**
     * 日志管理模块API分组
     */
    @Bean
    public GroupedOpenApi logApi() {
        return GroupedOpenApi.builder()
                .group("10. 日志管理")
                .pathsToMatch("/api/log/**")
                .build();
    }

    /**
     * 所有API分组
     */
    @Bean
    public GroupedOpenApi allApi() {
        return GroupedOpenApi.builder()
                .group("0. 全部接口")
                .pathsToMatch("/api/**")
                .build();
    }
}

